// Version: Stardard
void getNextval(Str substr , int nextval[] , int next[])
{ // 差分
	int j=1;
	int t=0; // t是子串のindex(下面)
	nextval[1] = 0; // special tag; 这个Function是'递推关系',从1->N

	while(j < substr.length)
	{
//这个t==0不仅是t从0->1的1级树层放行。还是通过t=next[t],t=10回溯到 0和 ch[j=11]比较时,代表全部无法匹配的情况下,将j的指针+1,且返回到1级树层
		if(t==0 || substr.ch[j] == substr.ch[t]) 
		{
			if(substr.ch[j+1] != substr.ch[t+1]) //'下一态'不等于'当前态'
				nextval[j+1] = t+1;
			else // '下一态' == '当前态'
				nextval[j+1] = nextval[t+1]; //next[j+1]=当前态, nextval[j+1]=下一态 = nextval[当前态]

			++j;
			++t;
		}
		else
			t = nextval[t]; //因为 nextval[t]是从1堆叠起来的
			// 通过 nextval[j+1] = nextval[next[j+1]]
	}
}


// 自我优化版
void getNextval(Str substr , int nextval[] , int next[])
{
	int j=1; // 用1个变量表示j和差分-1的t
	int t; //记录2个Point的插值

	nextval[1] = 0; // special tag; 这个Function是'递推关系',从1->N

	while(j < substr.length)
	{
//这个t==0不仅是t从0->1的1级树层放行。还是通过t=next[t],t=10回溯到 0和 ch[j=11]比较时,代表全部无法匹配的情况下,将j的指针+1,且返回到1级树层
		if(t==0 || substr.ch[j] == substr.ch[(j-t)]) 
		{
			if(substr.ch[j+1] != substr.ch[j]) 
				nextval[j+1] = j;
			else // '下一态' == '当前态'
				nextval[j+1] = nextval[j]; 

			++j; // t默认 = j - 1
		}
		else
			t = nextval[j] - nextval[j-1]; // t=偏移值 = 当前态 - 上一态
				//若前面Node相同, 上一态的val则继承于N个之前的点的nextval
	}
}